23

» WarCraft 3 / Воскрешение героя

Похожие вопросы:

ответ
таймер убери из структуры и структуру вешай на таймер
или если героев больше 10 то делай через 1 апдейт
а вобще код полный бред,мне придётся принять одновременно как минимум 5 различных наркотических веществ чтобы сделать подобное
код
library resp{
private real array sx
private real array sy

struct rhero{
unit a
integer b
boolean c
integer d

static nothing new(unit a,integer b){
rhero this=rhero.create()
.a=a
.b=b
.c=true
.d=GetPlayerId(GetOwningPlayer(a))
}

nothing up(){
if .b==0{
ReviveHero(.a,sx[.d],sy[.d],true)
.a=null
.c=false
.d=0
}
.b--
}

}

private nothing act1(){
unit a=GetTriggerUnit()
rhero b=rhero.new(a,GetHeroLevel(a))
a=null
}

private boolean cond1(){
return IsUnitType(GetTriggerUnit(),UNIT_TYPE_HERO)
}

private nothing update(){
rhero a=12
loop{
if a.c{
a.up
}
exitwhen a==1
a--
}
}

private nothing init(){
trigger a=CreateTrigger()
timer b=CreateTimer()
TriggerRegisterAnyUnitEventBJ(a,EVENT_PLAYER_UNIT_DEATH)
TriggerAddAction(a,function act1)
TriggerAddCondition(a,function cond1)
TimerStart(b,1,true,function update)
a=null
b=null
}

}
в глобалки занеси координаты стартовых позиций
ответ
call BJDebugMsg(string) отладка в редакторе.
ответ
Искать нужно лучше.
Раздел герой на гуях, действие Revive (instanty)

23

» WarCraft 3 / Поиск карты

Похожие вопросы:

ответ
"давным давно" это сколько лет назад? И что-нибудь поподробнее. Выживание кем? Какой геймплей?
ответ
Armouk, во первых это не вопрос
во вторых - почему тебе должны помогать?
лично я не вижу не 1 причины чтобы делать за тебя карту
или ты бог а все вокруг твои рабы?
если ты и вправду так думаешь то тебе на сайт любителей бдсм
ответ
Steal nerves:
Проблема в том, что, если в этой точке построено здание, то IsTerrainPathable(x, y, PATHING_TYPE_BUILDABILITY) не помогает (это терраин проверяет, а вот то что там построено или нет ему пофиг). Посмотрел в триггерах, есть только текстуры земли - уберспласты (там эти текстурки для здания) - нет функции такой в библиотеке jngp для проверки точки. Пробовал через группу, но там своя заминка (походу выборка ловит тех юнитов, точки которых попали в выборку, а не на целиком. Точно не проверял, но не работает с группой),
Clamp, решил через проверку
if (IssueBuildOrderById(YT, 'hhou', x, y) == false) then если не может построить, значит там здание или что-нибудь еще.
Clamp, помог еще твоя ссылка ExecuteFunc. видимо у меня лимит был, не хотело работать (просто дебаг не отобрал. и раб стоял). Хотя это уже не нужно было
А да слегка подвисает на секунду =(
Урра короче без лагов сделал (версия 3), подредактировать недоработку и будет норм
ответ
Похоже, это таки важный параметр. Будет учтено.

23

» WarCraft 3 / Миникарта

Похожие вопросы:

ответ
Temak1, В константах нет такого пункта!
ответ
ответ
Ладно, поставил разрешение в Варке на максимум, более или менее нормальный масштаб миникарт получается, всем спасибо за попытки помочь.
ответ
Импортируй черную текстуру с путём "war3mapMap.blp".
ответ
  1. файл миникарты есть картинка, которую можно подгрузить в карту
  1. есть нативки для регулировки границ камеры, они же вроде и миникарту уменьшают
  1. это галка в настройках карты самой

23

» WarCraft 3 / Ошибка define

Похожие вопросы:

ответ
~16GB:
function AddLocalEffect takes string eff, unit u,player p,string a returns effect
if not IsPlayerAlly(GetLocalPlayer(),p) and GetPlayerState(GetLocalPlayer(),PLAYER_STATE_OBSERVER) == 0 then
set eff = " "
endif
return AddSpecialEffectTarget(eff,u,a)
endfunction
неохота качать JNGP чтоб твой код тестить, заюзай эту функцию

23

» WarCraft 3 / Как правильно реализовать?

Похожие вопросы:

ответ
Ну как бы там все одно да потому, код тот же что я описал выше, вот только проверять все надо в МУИ это раз, два время затраченное на синхронизацию может быть пипец каким большим...
function Trig_SyncStr_Actions takes nothing returns nothing
    local string splayer = null
    local player pl = Player(0)
    
    if GetLocalPlayer() == pl then
        call StoreString( udg_Data, "A", "B", "твоя строка!" )
    endif

    call TriggerSyncReady()
    
    if GetLocalPlayer) == pl  then
        call SyncStoredString( udg_Data, "A", "B"  )
    endif

    call TriggerSleepAction( 2.00 )
    
    call TriggerSyncReady()
    
    set splayer = GetStoredString( udg_Data, "A", "B" ) // выгрузи строку из кеша в локалку и делай с ней что хочешь
    
endfunction

//===========================================================================
function InitTrig_SyncStr takes nothing returns nothing
    set gg_trg_SyncStr = CreateTrigger(  )
    call TriggerAddAction( gg_trg_SyncStr, function Trig_SyncStr_Actions )
endfunction
Триггер запускаем ExecuteTrigger а "Твоя строка" заменяется на глобальную переменную.
ответ
Перед созданием юнитов записать в переменную случайное число, а после - сделать проверку через If / Then / Else. Если (переменная) = 1, то дать каждому юниту в playarena[integer B] нужный предмет.
ответ
Steal nerves:
ответы
Как объединить зелья лечения в одно с зарядом, если герой имеет одно в инвентаре и поднимает второе?
обычно используют "событие - юнит получает предмет", И на предмет, который вы получаете, ссылается переменная, которая называется item being manipulated. А юнит, который получает итем - Triggering Unit. Вы можете с помощью этой переменной итема узнать тип, сравнить. Потом циклом пробегаете по слотам (от 1 до 6), тут вся суть в одной команде триггерной (item in slot X, итем в слоте Х) и проверяете есть ли такой же итем (не забываем делать проверки, на то что этот предмет не равен item being manipulated и сравниваете не одинаковые ли типы). Если есть такой же (находите тот же тип что и item being manipulated), то от item being manipulated берете заряды и прибавляете к зарядам существующего, а потом item being manipulated удаляете. Недостаток: при заполненном инвентаре такая штука не будет работать.Не хватает свободного места.
код
цикл А от 1 до 6
if тип итема (item being manipulated) РАВНО тип итема (item in slot А) and item being manipulated НЕ РАВНО item in slot А then проверяете
set k = Charges remaining in ( item being manipulated) + Charges remaining in ( item in slot А) складываете заряды
Set charges remaining in ( item in slot А) to ( k) устанавливаете кол-во зарядов
Remove Item (item being manipulated) удаляете
endif
Есть гуишная проверка на наличие итема определенного типа в инвентаре, но она утечна. И лучше циклом прогонять.
Кстати выше пример, там вот дропают итем, зачем? чтобы проверить есть ли такой же итем. А то мб проверка на наличие итема определенного типа в инвентаре найти подобранный итем. А нам нужно знать, что есть еще один, кроме подобранного. Поэтому дропают. Только не понятно зачем создаете новый итем.
Проверка, на то что подобранный предмет имеет зарядов больше 0, говорит нам о том что это не обычный предмет.
есть статьи
Как зелье с зарядом разделить, если игрок перекладывает зелье с зарядом в другую ячейку инвентаря, если возможно, то разделение происходить должно только при нажатии какой-то клавиши?
можно перекладывать в другой слот. для этого ловят приказ. Короче смотрите системы CCS
там создают новый такой же предмет, и выделяют кол-во зарядов, деля поровну например. Абилкой например, попробуй сделать целевую активную абилку с целью предмет, указывай на инвентарь и дели.
Как это можно сделать покороче для множества разных типов предметов?
всмысле покороче? сделать под одну группу? есть же классификация. Я вот делаю так, что все предметы, которые с зарядами, должны иметь классификацию "с зарядами". Не помню точно как называется класс итемов.
Как правильно реализовать в инвентаре 7 слот?
если у героя заполнен инвентарь, то он может подобрать руну. Вот в доте система скрещивания. То же самое можно сделать и с зарядами. На земле у него лежат руны, при подборе руна исчезает. Но мы проверяем слоты, есть ли такой итем. Если есть, прибавляем заряды к существующему. Иначе создать новый. При дропе итема, оригинал подменяет снова на руну. В руну можно передать значения зарядов.
А также ограничения какие-то на количество зарядов нужно ставить или сама система выше какой-то планки не даст собирать?
до такого не доходил.
скинул примеры (хотя многие дурацкие, но делал здесь хгм в качестве ответов)
вот еще одна система hh
ответ
Ну делать триггерную версию иллюзий, ибо придется создавать иллюзии жезлом иллюзий, ну а так же лепить спецэффект с помощтью юнитов снарядов.
Я как то делал кастомный аналог иллюзий мастера клинка. Там все просто, скрываем кастера и его клонов а на его место создаем спецэффект и даммики-снаряды, чтобы сделать спецэффект. У дефолтной mirror image - скорость снаряда 1150 ед.\сек. а дальность полета 150.
ответ
ApoloZ2, то что нужно?

23

» WarCraft 3 / Проблема с героями

Похожие вопросы:

ответ
Maxsavin, я каждой карте из кампаний даю свой кэш, чтобы не перепуталось ничего.
Не знаю, что получилось бы, сделай я один кэш-файл на всю кампу и грузи карты потом не по порядку. Проверять не буду.
Кампания - это пак карт.
ответ
XGM Bot:
Похожие вопросы:

ответ
Действие "Enforce victory/defeat comnditions" следует включить после того, как выберут расу, чтобы не выскакивало в начале.
ответ
Через что уничтожаешь? Если через килл, то конечно умирает и нейтральный.
  1. Если наносить от какого-то даммика урон в мильены, то не умрет нейтральный.
  2. Можно от даммика развеяние нежити за 0.01 сек.
  3. Заменять можно, внося значение золота в переменную и потом, создавая новый рудник, ставить количество золота в него из переменной, благо это даже в ГУИ реализовано.

ответ
Есть проверка IsUnitDead, где проверяется тип и состояние IsUnitType(u, UNIT_TYPE_DEAD) но никогда не было проблем с проверкой хп.
Так же насколько я помню GetWidgetLife( unit ) > 0.0 или GetUnitState( unit, UNIT_STATE_LIFE ) > 0.405.
ответ
~8gabriel8:
Вот сразу бы так!
Удалил из триггеров установку кампании Альянса, чего-то там ещё, сделал для триггеров событие, если не было, так как без него триггер не выполняется, мелкие корректировки внёс, а в третьей карте герой из кэша не восстанавливался, так как в редакторе объектов его не было, был изменённый Чародей Альянса, а это не одно и то же. Чтобы не копировать в каждую карту кампании героя, его нужно создать в редакторе кампаний на вкладке Нестандартные данные, тогда в каждой карте кампании в редакторе объектов он автоматически будет.
Посылаю кампанию тебе обратно также.
P. S. Обрати внимание на условие при нахождении посоха.
ответ
Исключи курьера из условий проверки уровней..

Добавь условие: Проверка Типа Юнита (Юнит Триггера) != (не равно) Курьер

23

» WarCraft 3 / Не отображаются анимации в игре

Похожие вопросы:

ответ
Чтобы при подборе меча игрались анимации для меча - можно укзать
Анимация - add animation tag to unit - first например. Будут проигрываться attack first, walk first и т.д. При отсутствии таковых будут играться бестеговые анимации.
Теги не какие попало добавляются, насколько я помню.
Используемые теги: fast, victory, first, second,third, fourth, fifth, swim, ready, alternate.
ответ
Почитай статью об эмиттерах. Скорее всего тебе нужно настроить видимость по кадрам.
ответ
здесь может быть что угодно, предположу, что только свежий варкрафт вылечит.
ответ
Анимация кости базы при death сместилась у конечной точки в линейке анимации. Поправил. В игре потестил, работает. Рассчитать границы нужны когда делаешь новые или изменяешь старые анимации, одна из причин чтоб анимация не сместилась и была на своем месте. Но в твоем случае она сразу не помогла.
ответ
8gabriel8, Вот, упрямый ведь! Берёшь скачиваешь свою модель, которую ты кинул в топик, рассчитываешь границы, импортируешь, для точности в новую карту 32x32 и если после этого портрет невидим, я в блоге напишу, что я гей. Конечно при условии, что ты все правильно сделаешь.

23

» WarCraft 3 / Не удаётся поставить модель

Похожие вопросы:

ответ
Hello and welcome to our site.
You can add maps this way
You can insert a picture this way:
to the left:
<- http://xgm.guru/pics/article/25886_1.png
centered:
<> http://xgm.guru/pics/article/25886_1.png
to the right:
-> http://xgm.guru/pics/article/25886_1.png
If you have more questions - feel free to ask
ответ
На данный момент я бы посоветовал использовать SharpCraft для реализации связи с сервером. В FL использовался заброшенный на данный момент RtC и версия варкрафта 1.24, так, что лучше выбрать что-нибудь поновее. Но у шарпкрафта уже появился конкурент со своими особенностями, конечно, многие функции мода еще не реализованы, выбор остается за вами: использовать SharpCraft уже сейчас (версия 1.2.4, на новых пока нет плагинов) или подождать модификацию Александра.
ответ
Переустановил игру, теперь, кажется, всё впорядке. Не знаю из-за чего там были такие баги :I
ответ
в виде какого кода
ты о чём вообще
короче читай мануал
ответ
А исправить эти его "тупые" действия никак нельзя?
переписать ai скрипты
он хранится в mpq архивах в файлах с расширением .ai
например аи для людей хранится в файле human.ai

23

» WarCraft 3 / vjass структуры, проблема наследования

Похожие вопросы:

ответ
стоп
а где заполнение массива структур?
мб все элементы массива одинаковы и ты просто инкриментишь одну и туже структуру 4 раза
создание структуры через статичный метод create идёт
ответ
В помощь тебе библиотеки(library) и базы данных.
Либы — для обращения по виду library_name.functionName(arguments)
Базы данных — для выделения юниту своих переменных.
С БД может быть момент не совсем понятным, поэтому скидываю пример:
Эта порнография разработана для личного пользования
У меня в коде есть иллюзия использования вжасса. Либа просто для доп табуляции и невостребованых манипуляций на случай импорта. При создании юнита ему присваивается ряд переменных, а номер этих переменных, относящихся к этому юниту, записывается в его(юнита) UnitUserData
library UnitDataBase
    globals
        constant integer       UnitDBSize = 512
        constant integer       UnitDBHeroesStart = 0
        constant integer       UnitDBHeroesUnder = 49
        constant integer       UnitDBUnitsStart = 50//Includes illusions of heroes. Or Should include them at least :P
        constant integer       UnitDBUnitsUnder = 319
        constant integer       UnitDBSummonsStart = 320
        constant integer       UnitDBSummonsUnder = 511
                 integer       UnitDBNextHero = 0
                 integer       UnitDBNextUnit = 50
                 integer       UnitDBNextSummon = 320
                 unit    array UnitDBUnit[UnitDBSize]
                 real    array UnitDBCurrentAnimationSpeed[UnitDBSize]
                 unit    array UnitDBForceAttackTarget[UnitDBSize]
                 integer array UnitDBAffectedByStuns[UnitDBSize]
                 real    array UnitDBMagicResistance[UnitDBSize]
                 real    array UnitDBPhysResistance[UnitDBSize]
                 real    array UnitDBCurrentArmor[UnitDBSize]//This armor does not include agility bonuses. Not used yet :>
                 real    array UnitDBWhiteMovementSpeed[UnitDBSize]
                 real    array UnitDBCurrentCustomSlow[UnitDBSize]
                 real    array UnitDBMagicDamageAmplifier[UnitDBSize]
                 real    array UnitDBPhysDamageAmplifier[UnitDBSize]
                 real    array UnitDBAdditionalHealth[UnitDBSize]//AKA Shield. Healed whenever unit takes damage.
        constant real          GravityAcceleration = 14.//Azeroth, bitch!
                 real    array UnitDBFlyingHeight[UnitDBSize]//Not used yet
                 real    array UnitDBFallingSpeed[UnitDBSize]
                 
                 integer array UnitDBItemUseVariable[UnitDBUnitsStart]//just don't ask
                 item    array UnitDBLastUsedItem[UnitDBUnitsStart]
                 real    array UnitDBCastPointX[UnitDBUnitsStart]
                 real    array UnitDBCastPointY[UnitDBUnitsStart]
                 
                 integer       UnitDBPreviousHero//Used for exitwhen event. Its next minus two.
                 unit    array UnitDBHeroHPBar[UnitDBUnitsStart]
                 unit    array UnitDBHeroMPBar[UnitDBUnitsStart]
                 unit    array UnitDBHeroSPBar[UnitDBUnitsStart]
    endglobals
    
    //Больно жирные для инлайна
    function UnitDBFindNextFreeVariable takes integer i returns integer
        local unit u
            loop
                set  u = UnitDBUnit[i]
                exitwhen u == null or GetUnitTypeId( u ) < 1
                set  i = i + 1
            endloop
        set  u = null
        return i
    endfunction
    
    function UnitDBAddHero takes unit u, real mdef, real armor returns nothing
        local integer i = UnitDBNextHero
        local real x = GetUnitX(u)
        local real y = GetUnitY(u)
            call UnitMakeAbilityPermanent( u, true, 'A00B' )
            set  UnitDBUnit[i] = u
            call SetUnitUserData( u, i )
            call GroupAddUnit( UnitsInPlayableArea, u )
            set  UnitDBItemUseVariable[i] = 0
            set  UnitDBCurrentAnimationSpeed[i] = 0.
            set  UnitDBAffectedByStuns[i] = 0
            set  UnitDBMagicResistance[i] = mdef
            set  UnitDBCurrentArmor[i] = armor
            set  UnitDBWhiteMovementSpeed[i] = GetUnitDefaultMoveSpeed( u )
            set  UnitDBCurrentCustomSlow[i] = 1.
            set  UnitDBMagicDamageAmplifier[i] = 1.
            set  UnitDBPhysDamageAmplifier[i] = 1.
            set  UnitDBFlyingHeight[i] = 0.//Doesn't include point height.
            set  UnitDBAdditionalHealth[i] = 0.
            /*if ( i == UnitDBHeroesUnder ) then
               call BJDebugMsg("|c00ff6060Hero limit reached! More heroes can be created, but things can go wild.")
            endif*/
            set  UnitDBNextHero = i + 1
            set  UnitDBPreviousHero = i - 1
            set  UnitDBHeroHPBar[i] = CreateUnit(BossPlayer1, 'hmil', x, y, 0. )
            call SetUnitAnimationByIndex( UnitDBHeroHPBar[i], 100 )
            set  UnitDBHeroMPBar[i] = CreateUnit( BossPlayer1, 'hrtt', x, y, 0. )
            call SetUnitAnimationByIndex( UnitDBHeroMPBar[i], 100 )
            set  UnitDBHeroSPBar[i] = CreateUnit( BossPlayer1, 'hwt2', x, y, 0. )
            call SetUnitAnimationByIndex( UnitDBHeroSPBar[i], 0 )
        set  u = null
        return
    endfunction

    function UnitDBAddUnit takes unit createdUnit, real mdef, real armor returns nothing
        local integer i = UnitDBNextUnit
        local unit u = UnitDBUnit[i]
            if ( u == null ) then
                set  i = UnitDBFindNextFreeVariable( UnitDBSummonsStart )
            endif
            set  UnitDBUnit[i] = createdUnit
            call SetUnitUserData( createdUnit, i )
            call GroupAddUnit( UnitsInPlayableArea, createdUnit )
            set  UnitDBCurrentAnimationSpeed[i] = 0.
            set  UnitDBAffectedByStuns[i] = 0
            set  UnitDBMagicResistance[i] = mdef
            set  UnitDBCurrentArmor[i] = armor
            set  UnitDBWhiteMovementSpeed[i] = GetUnitDefaultMoveSpeed( createdUnit )
            set  UnitDBCurrentCustomSlow[i] = 1.
            set  UnitDBMagicDamageAmplifier[i] = 1.
            set  UnitDBPhysDamageAmplifier[i] = 1.
            set  UnitDBFlyingHeight[i] = 0.
            set  UnitDBAdditionalHealth[i] = 0.
            if ( i < UnitDBSummonsUnder) then
                set  UnitDBNextSummon = i + 1
            else
                set  UnitDBNextSummon = UnitDBSummonsStart
            endif
        set  u = null
        set  createdUnit = null
        return
    endfunction
    
    function UnitDBAddSummon takes unit summonedUnit, real mdef, real armor returns nothing
        local integer i = UnitDBNextSummon
        local unit u = UnitDBUnit[i]
            if ( u == null ) then
                set  i = UnitDBFindNextFreeVariable( UnitDBSummonsStart )
            endif
            set  UnitDBUnit[i] = summonedUnit
            call SetUnitUserData( summonedUnit, i )
            call GroupAddUnit( UnitsInPlayableArea, summonedUnit )
            set  UnitDBCurrentAnimationSpeed[i] = 0.
            set  UnitDBAffectedByStuns[i] = 0
            set  UnitDBMagicResistance[i] = mdef
            set  UnitDBCurrentArmor[i] = armor
            set  UnitDBWhiteMovementSpeed[i] = GetUnitDefaultMoveSpeed( summonedUnit )
            set  UnitDBCurrentCustomSlow[i] = 1.
            set  UnitDBMagicDamageAmplifier[i] = 1.
            set  UnitDBPhysDamageAmplifier[i] = 1.
            set  UnitDBFlyingHeight[i] = 0.
            set  UnitDBAdditionalHealth[i] = 0.
            if ( i < UnitDBSummonsUnder) then
                set  UnitDBNextSummon = i + 1
            else
                set  UnitDBNextSummon = UnitDBSummonsStart
            endif
        set  u = null
        set  summonedUnit = null
        return
    endfunction
      
    //Система маг резиста была изменена на дефолтную, была введена аналогичная ей система физ урона.
    //Необходимо протестить эти системы на низких значениях. (могучий float и его точность). В нынешних условиях низкие значения не достигаются. На тест положен болт. Есть нерешенные проблемы с точностью(при восстановлении, опять же, резисты съезжают). Необходимо учитывать при вычислениях лишь первые три цифры после запятой, например.
    #define UnitDBIncreaseUnitMagicResistance( amount, userData ) = {
            set  UnitDBMagicResistance[userData] = UnitDBMagicResistance[userData] * amount
    }
    #define UnitDBDecreaseUnitMagicResistance( amount, userData ) = {
            set  UnitDBMagicResistance[userData] = UnitDBMagicResistance[userData] / amount
            if ( UnitDBMagicResistance[userData] > 0.99997 and UnitDBMagicResistance[userData] < 1.00003 ) then
                set  UnitDBMagicResistance[userData] = 1. 
            endif
    }
    #define UnitDBIncreaseUnitPhysResistance( amount, userData ) = {
            set  UnitDBPhysResistance[userData] = UnitDBPhysResistance[userData] * amount
    }
    #define UnitDBDecreaseUnitPhysResistance( amount, userData ) = {
            set  UnitDBPhysResistance[userData] = UnitDBPhysResistance[userData] / amount
            if ( UnitDBPhysResistance[userData] > 0.99997 and UnitDBPhysResistance[userData] < 1.00003 ) then
                set  UnitDBPhysResistance[userData] = 1. 
            endif
    }
    #define UnitDBReplaceUnitMagicResistance( before, after, userData ) = {
            set  UnitDBMagicResistance[userData] = UnitDBMagicResistance[userData] / before * after
    }
    #define UnitDBReplaceUnitPhysResistance( before, after, userData ) = {
            set  UnitDBPhysResistance[userData] = UnitDBPhysResistance[userData] / before * after
    }
    #define UnitDBIncreaseUnitMagicDamageAmplifier( amount, userData ) = {
            set  UnitDBMagicDamageAmplifier[userData] = UnitDBMagicDamageAmplifier[userData] + amount
    }
    #define UnitDBDecreaseUnitMagicDamageAmplifier( amount, userData ) = {
            set  UnitDBMagicDamageAmplifier[userData] = UnitDBMagicDamageAmplifier[userData] - amount
            if ( UnitDBMagicDamageAmplifier[userData] > 0.99997 and UnitDBMagicDamageAmplifier[userData] < 1.00003 ) then
                set  UnitDBMagicDamageAmplifier[userData] = 1. 
            endif
    }
    #define UnitDBIncreaseUnitPhysDamageAmplifier( amount, userData ) = {
            set  UnitDBPhysDamageAmplifier[userData] = UnitDBPhysDamageAmplifier[userData] + amount
    }
    #define UnitDBDecreaseUnitPhysDamageAmplifier( amount, userData ) = {
            set  UnitDBPhysDamageAmplifier[userData] = UnitDBPhysDamageAmplifier[userData] - amount
            if ( UnitDBPhysDamageAmplifier[userData] > 0.99997 and UnitDBPhysDamageAmplifier[userData] < 1.00003 ) then
                set  UnitDBPhysDamageAmplifier[userData] = 1. 
            endif
    }
    #define UnitDBIncreaseUnitShield( amount, userData ) = {
            set  UnitDBAdditionalHealth[userData] = UnitDBAdditionalHealth[userData] + amount
            //redraw
    }
    #define UnitDBDecreaseUnitShield( amount, userData ) = {
            set  UnitDBAdditionalHealth[userData] = UnitDBAdditionalHealth[userData] - amount
            if ( UnitDBAdditionalHealth[userData] < 0. ) then//Perhaps should be typed manually on every use. No need of that atm.
                set  UnitDBAdditionalHealth[userData] = 0.
            endif
            //redraw
    }
    function UnitDBAddUnitsCreatedOnInit takes nothing returns nothing
        local unit u = GetEnumUnit()
            if ( not IsUnitType( u, UNIT_TYPE_HERO ) ) then
                call UnitDBAddUnit( u, 1., 0. )//!!! whatever
            endif
        set  u = null
        return
    endfunction
    
endlibrary
ответ
allocate() используется внутри статичного метода и возвращает лишь индекс новой структуры
Технически верно, но на практике использовать .allocate() есть смысл только при перегрузке .create() (равно как и .deallocate() только при перегрузке .destroy()). Собственно, согласно документации, для того эти методы и существуют.
ответ
Напиши простейший код, скомпиль и посмотри во что превращается. Никаких структур в движке варика нет, вжасс это надстройка которая транспилит в обычный жасс.
ответ
- Я использую это:
struct linkedList
        private  static  constant  timer     period  =  CreateTimer( )
        private                    thistype  prev
        private                    thistype  next


        private stub method destroy takes nothing returns nothing

//          Здесь должен находится Ваш код.

            set  this.prev.next  =  this.next
            set  this.next.prev  =  this.prev

            if ( thistype( 0 ).next == 0 ) then
                call PauseTimer( thistype.period )
            endif

            call thistype.deallocate( this )
        endmethod


        private static method iterate takes nothing returns nothing
            local  thistype  this  =  thistype( 0 ).next

            loop
                exitwhen ( this == 0 )

//              Здесь должен находится Ваш код.

                call this.destroy( )

                set  this  =  this.next
            endloop
        endmethod


        private static method create takes nothing returns thistype
            local  thistype  this  =  thistype.allocate( )

            set  this.next         =  thistype( 0 )
            set  this.prev         =  thistype( 0 ).prev
            set  this.next.prev    =  this
            set  this.prev.next    =  this

//          Здесь должен находится Ваш код.
            
            if ( this.prev == 0 ) then
                call TimerStart( thistype.period, 0.03125, true, function thistype.iterate )
            endif

            return this
        endmethod


    endstruct
static method create takes nothing returns nothing
static method iterate takes nothing returns nothing
method destroy takes nothing returns nothing
Для работы этого двусвязного списка требуется создать 2-е переменные с именами next, prev.

23

» WarCraft 3 / Модели Юнита

Похожие вопросы:

ответ
Есть способность "Тёмный", если дать её юниту, то он заменится на юнит указанный в способности.У такого варианта наименьшее число неудобств.
ответ
Через триггеры и способности. Дать спосбность морфа и приказать ее использовать. Предварительно создать новую альтернативную единицу с другой моделью
Для героев:
Перевоплощение - Иллидан
Превратиться в кибергоблина (Проверено - работает)
ответ
В программе War3ModelEditor можно автоматически рассчитать границы. Но перед этим нужно вывести хотя бы одну точку на необходимое расстояние.
После чего точку можно удалить.
ответ
Nelloy, если найдёт где в памяти хранится модель после чего сам создаст модель из файла и заменит модель юнита на новую то можно
Pergin, гугли memory hack war3
это сложно и требует от тебя больших знаний в джасс и понимания работы движка игры
без этого даже не пытайся
либо делай через морф
как морфить одного юнита в другого написано в статьях
ответ
  1. Хорошая модель должна иметь минимальное необходимое количество полигонов. Что будет если заспавнить много юнитов можешь проверить и сам.
  1. 8 Мб - лимит для патчей до версии 1.26. В последнем патче карта может весить 100+ Мб. О скорости скачивания ничего не могу сказать.

23

» WarCraft 3 / Экран статистики

Похожие вопросы:

ответ
скопировать путь отсюда - дело 5 секунд

а так придется реимпортировать иконки в карту и писать им свой путь, в итоге вырастет вес
и никому это не нужно

23

» WarCraft 3 / Вопрос по Jass

Похожие вопросы:

ответ
Чтобы было норм читать, надо хотя бы выделять содержимое каждого блока (типа function/endfunction, if/endif, loop/endloop) табуляцией. Если блок внутри блока, то двойная табуляция, и т. д.
В vJASS и cJASS не стоит использовать одновременно C-подобный и Turing-подобный (стандартный JASS) синтаксис.
А если ты неправильно поставишь пробелы, запятые или кавычки, тебе об этом скажет парсер =)
ответ
Во-первых, что есть "локальный таймер" ? Это таймер записанный в локальную переменную?
Во-вторых, зачем тебе точка, если ты используешь XY ? Работай с ними
В-третьих, да. Использование в течении всей игры одной заранее созданной точки вызывает меньше нагрузки чем постоянно создание и удаление новых (кто-то там доказывал на примере и цифрами что от ремувнутых точке всё равно остаётся шлак в памяти...)
ответ
Всё, понял как сделать
ответ
Там до +50 не хватает скобки

23

» WarCraft 3 / Урон в зависимости характеристик

Похожие вопросы:

ответ
  1. а) Создай 2 переменные-массива по типу "боевая единица" (массив - чтобы для каждого игрока, мы ведь за мультиплеер трем, прально?), назови типа MyChampion и MyChampionDummy.
    б) подготовь невидимого героя-пустышку с нужной тебе иконкой, убери ману, если у чемпиона ее нет. Убери ему радиус обзора, убери галочки типа "отмечать на мини-карте" - остальные - опционально.
    В дальнейшем мы будем синхронизировать пустышку и реального чемпиона, создавая видимость одной боевой единицы.
    Итак, наш первый триггер:
в) Отследи первое появление чемпиона, когда это случится - создай для игрока героя-пустышку. Соответственно сделай MyChampion [number of (Owner of trained unit)]= last trained unit, следующей строчкой создай того самого героя-пустышку для (owner of trained unit) и сделай MyChampionDummy = last created unit. Теперь мы прочно связали этих чуваков. Этот же триггер запускает остальные.
г) Отслеживание здоровья. Сделай изначально выключенный цикличный триггер, там, каждые 0.3 секунды. Триггер запускается пунктом в). Каждые 0.3 секунды меняй здоровье героя (чья икона висит, надо чтобы она соответствовала, прально?) в % на здоровье самого чемпиона.
д) пропищи событие, мол, если выбирает игрок своего героя (кликая на иконку) выбирается чемпион
е) убивай героя вместе с чемпионом
ж) отключай триггеры с проверкой и выбором, пока чемпион мертв
з) не забывай обновлять переменную чемпиона с каждым новым чемпионом.

23

» WarCraft 3 / эффект

Похожие вопросы:

ответ
Карта с нестандартными молниями и описанием. Смотреть Readme в менеджере импорта.
Если тебе типа фиолетовой молнии рубика надо, то вот есть вроде этого
В эффектах молнии пишешь PISU
В менеджере импорта путь splats\lightningdata.slk
ответ
XGM Bot:
Похожие вопросы:

ответ

Проблема 4: Сброс анимации текстур

Если указываешь в настройках материала "Id анимации текстуры", то после сохранения этот параметр опять сбрасывается в "none".
Решение:
Сохранить в .mdl, открыть блокнотом. Ищем нужный материал, добавляем новую строчку TVertexAnimId и после пробела ставим id нужной анимации текстуры(обычно 0). Затем кодируем в mdx с помощью MdlVis.
Пример:
Material {
ConstantColor,
Layer {
FilterMode Transparent,
Unshaded,
TextureID 1
**TVertexAnimId 0**,
}
ответ
bazeba:
Ах да забыл написать, переливание электричества как у водяного элементаля, мне кажется эта текстура подходит
Вот вот как у водяного элементаля, открываешь эту модель и смотришь что и как там и все получится.
ответ
DarkRiset:
Darknessay:
Кажется ты не понимаешь, как работают фильтры альфы.
Не понимаю. Как раз поэтому и задал вопрос.
В ME открой модель. Там есть фильтры Addative и Add Alpha, которые работают схожим образом: чем темнее, тем прозрачнее(черный = 100%). Есть какой то альтернативный фльтр, вроде Modulate, который отображает белый как прозрачный. Посмотри в материалах(Window\Material manager\).
Это касательно отображения.
А ошибка скорее всего не в том, но попроси изменить эффект того, кто в этом шарит, ведь если она выбивает после того, как его редактировал ты, значит ты где то напартачил.)
ответ
ClotPh,
  1. открыть модель в моделедиторе
  2. окна -> редактор узлов
  3. там найти все источники частиц (у них иконки в виде синих/красных стрелочек)
  4. два раза щелкнуть на источник, откроется окно редактирования
  5. там обычно три цвета, вот их можно поменять нажав на кнопку "..." рядом с каждым, открывается цветовой диалог; еще в этом окне можно посмотреть/поменять текстуру источника
ответ
Смею предположить, что все что ниже уровня моста на скринах - декор под пустой текстурой (альфа-тайл)

ответ
zontik2012 нет, не является утечкой. Если бы ты крепил эффект к точке, к примеру в позиции юнита, причем не удалял бы эту точку потом - то это была бы утечка
ответ
В триггере с инициализацией создаешь действие: Игрок - make Ю2 недоступно for training by игрок.
Создаешь триггер: юнит завершает исследование (твой аналог берсерка) - заблокировать Ю1 (как в пункте 1), а Ю2 - разблокировать.
Создаешь способность на основе Безумие (Sbsk), указываешь в графе "новый тип войск" Ю2, даешь эту способность Ю1.

23

» WarCraft 3 / Вода

Похожие вопросы:

ответ
похоже что придется делать обычный блокиратор путей, а для посадки можно просто повысить радиус действия данной способности, чтобы она была дальше самого тонкого блокиратора пути. Теоретически должно сработать
ответ
напиши мне
Тебе описали несколько алгоритмов решения возникшей задачи и средства, с помощью которых они могут быть реализованы; реализация решения остаётся за тобой как за тем, у кого эта задача возникла.
Ты также можешь отказаться от решения задачи, но не имеешь никакого морального права требовать реализовать это решение за тебя.

Как вариант - покрасить всю глубокую воду определённым тайлом и отлавливать именно его.
Если по-умолчанию карта была создана с глубокой водой, то вот.
native GetTerrainCliffLevel takes real x, real y returns integer
Подсказка:
PATHING_TYPE_AMPHIBIOUSPATHING
PATHING_TYPE_WALKABILITY

native IsTerrainPathable takes real x, real y, pathingtype t returns boolean
Берёшь координаты, или точку (одно и другого получить можно, в обе стороны)
Проверяешь подходит ли точка для плавания
Если да - то это либо мелководье, либо глубоководье
Проверяешь подходит ли точка для ходьбы
Если нет - это глубоководье, если да - это мелководье
Далее ты можешь ещё проверить уровень склона (клифф) в точке, но проверки на проходимость и так должно быть достаточно... проверкой уровня ты лишь получишь то на какой высоте эта вода... (а она может быть на разных высотах).
ответ
Можно ли менять уровень рельефа (аналог действия +/- 1-2 в Редакторе Рельефа) триггерами или джасс?
И аналогичный вопрос про воду. Можно?
Нельзя менять ни уровни склонов, ни уровень воды. Можно только уровень земли менять. (Типа как просто «повысить/понизить» в редакторе.)
ответ
Почему то на таймере всё забагалось и прилетало по несколько ивентов, сделал на периодическом триггере и всё стало нормально.
Код
globals
    region region123
    trigger trg = CreateTrigger()
    real maxX
    real minX
    real maxY
    real minY
    real pointX
    real pointY
endglobals

function Run takes nothing returns nothing
    if pointY < minY then
        call TriggerRegisterEnterRegion( gg_trg_enter, region123, null )
        call TriggerRegisterLeaveRegion( gg_trg_leave, region123, null )
        call DisableTrigger( trg )
    endif
    if pointX > maxX then
        set pointY = pointY-32.00
        set pointX = minX
    endif
    if IsTerrainPathable(pointX, pointY, PATHING_TYPE_FLOATABILITY) == false then
        call RegionAddCell( region123, pointX, pointY )
    endif
    set pointX = pointX+32.00
endfunction

function Trig_trg_Actions takes nothing returns nothing
    set region123 = CreateRegion()
    set maxX = GetRectMaxX(bj_mapInitialPlayableArea)
    set minX = GetRectMinX(bj_mapInitialPlayableArea)
    set maxY = GetRectMaxY(bj_mapInitialPlayableArea)
    set minY = GetRectMinY(bj_mapInitialPlayableArea)
    set pointX = minX
    set pointY = maxY
    
    call TriggerRegisterTimerEvent( trg, 0., true )
    call TriggerAddCondition( trg, Condition(function Run) )
endfunction

//===========================================================================

function InitTrig_trg takes nothing returns nothing
    call Trig_trg_Actions()
endfunction
Вот карта с примером (карту сохранить не сможешь, т.к тебе нужен будет JNGP, это просто чтобы ты посмотрел сам алгоритм)
И учти что чем больше карта, тем больше времени нужно алгоритму что построить регион

23

» WarCraft 3 / Вопрос по заданиям.

Похожие вопросы:

ответ
The Dude, это несерьезно. Все вопросы описаны в большом количестве статей здесь, на нашем сайте - xgm.guru/p/wc3/articles. То, что перечисляешь не верх мастерства WE, а базовые знания. Материалов предостаточно. Успехов в обучении.
ответ
Ты не представляешь, сколько раз он был задан. Я уверен, ты сам справишься с поисками.
ответ
Скачай и максимальный размер карты в этой программе будет 480*480. xgm.guru/p/wc3/jassnewgenpack-r
ответ
Нет, ты создаешь квест для всех, потом скрываешь их, редактируешь как хочешь и показываешь их нужному игроку т.е GetLocalPlayer().

23

» WarCraft 3 / Вопрос про облости

Похожие вопросы:

ответ
как и со всеми остальными объектами при правильном использовании утечек нету
при неправильном утечек дофига
а так утечки можно наплодить чем угодно кроме чисел, буленов и игроков

23

» WarCraft 3 / Пассивная способность героя

Похожие вопросы:

ответ
Хозяин Миров:
Вот. Только совмещение нерабочее получилось, но оставил пока что.
ответ
Когда юнит проучивает пассивку, добавляй в группу юнита, который выучил пассивку. Дальше все просто -
Юнит умирает
Киллинг юнит в нашей группе - да
Дайинг юнит не в команде владельца киллинг юнит.
Игрок - адд проперти - 500 золото (овнер оф киллинг юнит)
ответ
На основе полностью триггерного снаряда, сделанного из работника (если вам так интересно).
Если сало выучит глейвы, то будет получать бонусы интелекта (если мне не изменяет память), сам снаряд тупо юнит которого двигают с сайленсером и проверяют жив ли он.
Могу выложить код сайленсера.
ответ
возможные способности, господи, строчка выше, вы хотяб проверяли все сами а не ждали иисуса с небес
там даже подпись категории - способности
ответ
триггерно пассивки делай
иначе никак

23

» WarCraft 3 / Скелеты из атаки

Похожие вопросы:

ответ
Экстрасенсы чувствуют что ты шаришь только в GUI, так что замути абилку на основе канала с временем каста 2.33 и нужной анимацией. Она, правда, как-то хреново взаимодействует со станами - не кислотной бомбой (или че-то такое, никогда не сталкивался, пофиг), но послужит тебе верно. При спавне просто кастуй абилку.
ответ
Да сделай проще. Создай многоуровневую способность-пустышку. и когда отдаешь приказ атаковать в область, давай ему эту способность и с помощью неё отслеживай, какую область атаковать.
Например,
способность уровень 1, значит атаковать должен 1 область.
Уровень 2 - 2 область и т. д.
Не вижу смысла усложнять жизнь с хеш-таблицей.
Надеюсь понятно?) Отдал приказ, присвоил способность, после каста жди пару сек и в зависимости от уровня способности-пустышки отправляй в ту или иную область.

23

» WarCraft 3 / Заговор неуязвимости не работает у здания

Похожие вопросы:

ответ
Я припоминаю как сталкивался с таким. Скорее всего это не лечится. Можно попробовать создавать даммика на месте здания и заставлять его использовать заклинание. Или даже полностью самому написать спелл - он довольно прост.
ответ
Не берите вы эти ульты для основы своих скиллов, они сделаны через одно место лиж бы работали в капмании, а там дальше хоть потоп.
Сделайте заклинание из канала, а юнитов вокруг делайте неуязвимыми.

23

» WarCraft 3 / 2 цифры урона

Похожие вопросы:

ответ
ответ
Атака оглушением вызывает подобную ерунду. Да и не только.
Например в доте бы вылетало сообщение 0 при атаке имея МКБ - сообщался бы урон, урон от микробаша, если бы выпал и 0.00 от нулевого критического удара.
Решение простое - поставь условие, что полученный урон больше 0.00, тогда только выводить.
ответ
Нужно менять 'AHtb' - это код способности (соответственно - молот бурь). Сюда нужно вставить код своей способности.
Ctrl+D в РО отображает коды.
А может и не Ctrl+D, но будет прикольно, если я вспомнил.
ответ
Ну это сплеш, на тип урона не проверял, область настраивается и кол-во урона, оно же урон по аое.
Не все, а орбы предметов, орб может включить вторую атаку героя, только если она изначально выключена и есть. По этой причине владельцы орбов порой считаются юнитами дальнего боя, что разумеется не так (вторая атака всегда атака дальнего боя у всех дефолтных героев в варкравте, особо вторую атаку никто не настраивает.)
В орбах вроде сферы огня нету ничего интересного или полезного, лучше делать руками те эффекты которые они дают.

23

» WarCraft 3 / Особый персонаж

Похожие вопросы:

ответ
1 - не стоит создавать отдельный триггер для способности с периодом в 0.5 секунды
2 - об утечках триггера 003 не говорю, думаю сам знаешь
3 - второй триггер очевидно у тебя не работает? Потому что Triggering Unit'а просто нет в событии

Что я тебе предлагаю:
В первом триггере все тоже собитие\условие, в действии повышатьуроверь способности на базе Жара прейсподней(пассивного), ну конечно поменяешь в РО эффекты и др. И по истечении времени менять уровень на 1 этой способности. Как сделать чтоб не было видно иконки этого Жара? Добавляешь её в спец.созданную Книгу заклинаний и триггерно, к примеру на Map Init запрещаешь использовать игроку эту Книгу заклинаний.
ответ
  1. а) Создай 2 переменные-массива по типу "боевая единица" (массив - чтобы для каждого игрока, мы ведь за мультиплеер трем, прально?), назови типа MyChampion и MyChampionDummy.
    б) подготовь невидимого героя-пустышку с нужной тебе иконкой, убери ману, если у чемпиона ее нет. Убери ему радиус обзора, убери галочки типа "отмечать на мини-карте" - остальные - опционально.
    В дальнейшем мы будем синхронизировать пустышку и реального чемпиона, создавая видимость одной боевой единицы.
    Итак, наш первый триггер:
в) Отследи первое появление чемпиона, когда это случится - создай для игрока героя-пустышку. Соответственно сделай MyChampion [number of (Owner of trained unit)]= last trained unit, следующей строчкой создай того самого героя-пустышку для (owner of trained unit) и сделай MyChampionDummy = last created unit. Теперь мы прочно связали этих чуваков. Этот же триггер запускает остальные.
г) Отслеживание здоровья. Сделай изначально выключенный цикличный триггер, там, каждые 0.3 секунды. Триггер запускается пунктом в). Каждые 0.3 секунды меняй здоровье героя (чья икона висит, надо чтобы она соответствовала, прально?) в % на здоровье самого чемпиона.
д) пропищи событие, мол, если выбирает игрок своего героя (кликая на иконку) выбирается чемпион
е) убивай героя вместе с чемпионом
ж) отключай триггеры с проверкой и выбором, пока чемпион мертв
з) не забывай обновлять переменную чемпиона с каждым новым чемпионом.
ответ
"Далеко твоя рпг не уйдёт" моя рпг тебя переживет.
Ты тоже когда родился не умел так нагло хамить незнакомым людям, научился же как то. Люди с более серьезным отношением к миру чем "изменить систему один не могу но буду плакать об этом" могут изучить все что захотят и даже в одиночку будут стоить больше чем тысяча "всегда сдающихся" людей,
и тот человек (Да удалось, даже был лаунчер для этой игры. Forgotten Land) это подтвердил, хотя я уверен что он быстро опустил руки.
p.s чел прекращай настраивать других людей на поражение, если ты что-то можешь дать - дай, если хочешь чтобы другие не добились успеха чтобы ты оказался прав и не чувствовал себя ущербным то просто отойди в сторону.
Я на все твои выпады отвечу лишь одной фразой:
"Dota была обычной картой для warcraft 3 и она поначалу тоже была пустой ".
Ответы получены, пару шарящих людей нашел, (дай бог каждому такого человека который рассказал мне о многом что тут считают до сих пор невозможным)
Спасибо за поддержку! и особенно одному пользователю. Ведь именно благодаря таким людям как life2smiler, люди не делают хорошие проэкты а другие люди соответственно вынуждены играть в некачественные карты и в течении нескольких лет не находить решения наболевших проблем
(если нет хотя бы 1 го человека кому удалось сделать что-то необычное то все остальные продолжат считать это невозможным) А сегодня стало ясно что могут не знать о чем либо не только потому что никто не делал этого, а потому что человек на самом деле сделал но никому говорить не стал :)
ответ
Обращение ко всем, вопрос закрыт наилучшим образом, ничьи услуги больше не требуются.

23

» WarCraft 3 / Сделать берсерка доступным

Похожие вопросы:

ответ
поставить в РО у юнита "требования" на технологию, и теперь пока она не изучена, они не будут доступны. И может быть еще способностях надо будет покопаться и в технологиях